package tech.waterism.topo.model;

import lombok.Data;

import java.util.List;

/**
 * 拓扑节点
 * 
 * <p>表示水系拓扑结构中的一个节点（水库、河道断面、蓄滞洪区等）
 * 
 * @author waterism
 * @since 1.0.0
 */
@Data
public class TopoNode {
    
    /** 站码（唯一标识） */
    private String stcd;
    
    /** 站名 */
    private String stnm;
    
    /** 父站码（用于联调时标识同一站点的不同实例） */
    private String pstcd;
    
    /** 输出类型（站点类型）：IQ=水库, DZQ=蓄滞洪区, Q=河道等 */
    private String outcd;
    
    /** 调度类型：0=天然出流, 1=当前出流, 3=反算出流, 4=自定义规则 */
    private Integer dispatchType;
    
    /** 出流类型：0=水位反推, 1=指定出流, 2=闸门开度 */
    private Integer outFlowType;
    
    /** 时段长（秒） */
    private Integer clen;
    
    /** 时间单位：H=小时, M=分钟 */
    private String unt;
    
    /** 时序数据列表 */
    private List<TimeSeriesData> data;
    
    /** 输入分量列表（上游来水） */
    private List<InputComponent> inputs;
    
    /** 基流序列（地下水补给） */
    private List<Double> qBases;
    
    /** 水位库容曲线 */
    private List<CurvePoint> curveHs;
    
    /** 泄流设备列表 */
    private List<SpillwayInfo> spillways;
    
    /** 枢纽信息（如果是枢纽节点） */
    private HubInfo hub;
    
    /** 调度规则ID */
    private String principleId;
    
    /** 取水口列表 */
    private List<IntakeInfo> intakes;
    
    /** 洪水特性值（警戒水位等） */
    private FloodCharacter floodCharacter;
    
    /**
     * 判断是否为水库节点
     */
    public boolean isReservoir() {
        return outcd != null && (outcd.equals("IQ") || outcd.equals("IZQ"));
    }
    
    /**
     * 判断是否为蓄滞洪区节点
     */
    public boolean isRetentionArea() {
        return "DZQ".equals(outcd);
    }
    
    /**
     * 判断是否为河道节点
     */
    public boolean isRiver() {
        return outcd != null && (outcd.equals("Q") || outcd.equals("Z") || outcd.equals("ZQ"));
    }
    
    /**
     * 判断是否为枢纽节点
     */
    public boolean isHubNode() {
        return hub != null;
    }
}

